# -*- coding: utf-8 -*-
'''
Created on Oct 30, 2010

@author: HoangNamHai
'''
import datetime
import os, traceback
import  threading
import workerpool
from pprint import pprint
from pymongo import Connection
from commonlib import *
# from IPython.Debugger import Tracer   # Khi debug thì mới cần include. Không dùng thì bỏ cho nhẹ

# connection = Connection('localhost', 27017)
connection = Connection('beta.mana.vn', 27017)
db = connection['thoitiet_v2']
collection = db['datlien'] 
# collection = None       # Collection để lưu dữ liệu trong MongoDb
start = 0

ids = {80:"Bắc Giang",
        81:"Bắc Ninh",
        86:"Bắc cạn",
        83:"Cao Bằng",
        88:"Hải Phòng",
        63:"Hưng Yên",
        48:"Hải Dương",
        65:"Hà Tây",
        68:"Hà Giang",
        82:"Lạng Sơn",
        64:"Nam Định",
        46:"Ninh Bình",
        49:"Phủ Lý",
        120:"Quảng Ninh",
        84:"Tuyên Quang",
        85:"Thái Nguyên",
        58:"T.P Hà Nội",
        47:"Thái Bình",
        76:"Việt Trì",
        77:"Vĩnh Phúc",
        4:"Hòa Bình",
        69:"Lào Cai",
        70:"Điện Biên",
        78:"Sơn La",
        87:"Yên Bái",
        127:"Lai Châu",
        44:"T.P Hồ Chí Minh",
        45:"Bình Dương",
        50:"Long An",
        51:"Đồng Tháp",
        52:"Tiền Giang",
        53:"Bến Tre",
        54:"Hậu Giang",
        56:"Cần Thơ",
        57:"Sóc Trăng",
        59:"Bạc Liêu",
        60:"Bình Phước",
        61:"Vũng Tàu",
        62:"Đồng Nai",
        66:"Tây Ninh",
        73:"Kiên Giang",
        74:"Cà Mau",
        95:"Vĩnh Long",
        96:"An Giang",
        28:"Hà Tĩnh",
        29:"Quảng Bình",
        30:"Quảng Trị",
        31:"Thừa Thiên Huế",
        106:"Thanh Hóa",
        111:"Nghệ An",
        34:"Quảng Ngãi",
        37:"Nha Trang",
        39:"Bình Thuận",
        92:"Đà nẵng",
        94:"Bình Định",
        99:"Phú Yên",
        100:"Ninh Thuận",
        119:"Quảng Nam",
        40:"Kon Tum",
        41:"Pleiku",
        42:"Đắk Lắk",
        43:"Đà Lạt",
        71:"Đắk Nông"}

def isDataAvailable(data):
    for i in range(0,3):
        if len(data['bangaytoi'][i]['ngay']) < 6: return False
        if len(data['bangaytoi'][i]['nhietdocaonhat']) < 2: return False
        if len(data['bangaytoi'][i]['nhietdothapnhat']) < 2: return False
    return True

def process(provinceId):
    ''' Xử lý tách dữ liệu từ web trung tâm khí tượng thủy văn
        provinceId xem trên bảng ids ở phía trên
    '''
    result = False
    url = 'http://www.nchmf.gov.vn/web/vi-VN/62/19/{0}/map/Default.aspx'.format(provinceId)
    print url
    data = {}
    try:
        tree = getXMLTree(url)
        data['lastupdate'] = datetime.datetime.now()
        data['_id'] = provinceId
        data['provinceId'] = provinceId
        data['provinceName'] = ids[provinceId]
        data['thanhpho'] = getElementText(getFirstNode(tree, '//td[@class="thanhpho_bgr thanhpho_ten"]/span')).strip()
        data['thanhpho'] = data['thanhpho'].replace('Thời tiết ', '')
        data['nhietdo'] = getElementText(getFirstNode(tree, "//tr[2]/td[2][@class='forecast_detail']/strong[1]")).strip()
        data['thoitiet'] = getElementText(getFirstNode(tree, "//tr[1]/td[1]/span[1][@class='forecast_detail']/strong[1]")).strip()
        data['doam'] = normalizeStr(getElementText(getFirstNode(tree, "//td[1]/table[1]/tr[6]/td[2][@class='forecast_detail']/strong[1]")))
        data['huonggio'] = getElementText(getFirstNode(tree, "//td[1]/table[1]/tr[8][@style='Display:Yes']/td[2][@class='forecast_detail']/strong[1]")).strip()
        data['icon'] = getAttribText(getFirstNode(tree, "//img[1][@style='PADDING-TOP: 10px']"), 'src').strip()
        data['reporttime'] = normalizeStr(stringify(getFirstNode(tree, "//span[1][@class='forecast_detail_update']")))

        data['reporttime'] = unicode(data['reporttime'], 'utf-8')

        data['reporttime'] = data['reporttime'].replace(u'C\u1eadp nh\u1eadt l\xfac:', '')
        data['bangaytoi'] = []
        data['bangaytoi'].append({'ngay': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[1]/td[2]"))), 
            'thoitiet': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[2]/td[2]"))), 
            'icon': getAttribText(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho__ctl0_Panel2']//img"), 'src'), 
            'nhietdothapnhat': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[3]/td[3]/strong"))),
            'nhietdocaonhat': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[4]/td[2]/strong"))),})
        data['bangaytoi'].append({'ngay': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[1]/td[3]"))), 
            'thoitiet': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[2]/td[3]"))), 
            'icon': getAttribText(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho__ctl0_Panel1']//img"), 'src'), 
            'nhietdothapnhat': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[3]/td[4]/strong"))),
            'nhietdocaonhat': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[4]/td[3]/strong"))),})
        data['bangaytoi'].append({'ngay': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[1]/td[4]"))), 
            'thoitiet': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[2]/td[4]"))), 
            'icon': getAttribText(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho__ctl0_pl72']//img"), 'src'),  
            'nhietdothapnhat': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[3]/td[5]/strong"))),
            'nhietdocaonhat': normalizeStr(stringify(getFirstNode(tree, "//table[@id='_ctl1__ctl0__ctl0_dl_Thoitietthanhpho']//table//tr[4]/td[4]/strong"))),})
        pprint(data)
        if isDataAvailable(data):
            print 'Data ok'
            collection.save(data)
            result = True
        else:
            print 'DATA NOT AVAILABLE'
        return result
    except:
        pprint(data)
        traceback.print_exc()
        # Tracer()()
        return False

def timeOut():        
    while True:
        delta = time.time() - start
        cprint('Delta: ' + str(delta), 'yellow')
        if delta > 900:
            print 'Dừng chương trình vì vượt quá thời gian chạy.', datetime.datetime.now()
            pid = os.getpid(); os._exit(1); os.kill(pid, 9)
        time.sleep(30)

def forceQuit():
    try:
        print 'Finished.', datetime.datetime.now()
        pid = os.getpid(); os._exit(1); os.kill(pid, 9)
    except:
        traceback.print_exc()

if __name__ == '__main__':
  #process(29)
  start = time.time() 
  #timeout = threading.Thread(target=timeOut).start()
  for k in ids.keys():
      result = process(k)
      if result==False:
          for i in range(0, 5):
              check = process(k)
              if check: break
  forceQuit()
  #    except:
  #        traceback.print_exc()
  #    print ids[k]
